<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>批量下载文件</title>

    <style>
        .textarea {
            width: 100%;
            height: 500px;
        }
    </style>
</head>

<body>
    <textarea class="textarea" id="urlTextarea"></textarea>

    <button id="downloadButton" onclick="toDownload()">开始下载</button>

    <div>
        总数：<span id="total"></span>，成功数量：<span id="successCount"></span>，失败数量：<span id="failedCount"></span>
    </div>

    <script src="./js/jquery-1.11.1.min.js"></script>
    <script src="./js/jszip.min.js"></script>
    <script src="./js/FileSaver.js"></script>
    <!-- <script src="./js/downloadList.js"></script> -->
    <script>
        function toDownload() {
            let arrayFromTextArea = splitTextAreaValue('urlTextarea');

            if(!arrayFromTextArea || arrayFromTextArea.length == 0) {
                alert('请输入url，多个换行或者逗号分隔')
                return
            }

            document.getElementById('total').innerText = arrayFromTextArea.length;
            document.getElementById('successCount').innerText = 0;
            document.getElementById('failedCount').innerText = 0;
            document.getElementById('downloadButton').textContent = '下载中...';
            document.getElementById('downloadButton').disabled = true;

            downloadAndCompressFiles(arrayFromTextArea, null, (successCb, failedCb) => {
                document.getElementById('downloadButton').textContent = '开始下载';
                document.getElementById('downloadButton').disabled = false;
                console.log('成功数量', successCb || 0)
                console.log('失败数量', failedCb || 0)
            }, (progressRes) => {
                document.getElementById('total').innerText = progressRes.total;
                document.getElementById('successCount').innerText = progressRes.successCount;
                document.getElementById('failedCount').innerText = progressRes.failedCount;
            })
        }

        function splitTextAreaValue(textareaId) {
            // 获取textarea元素  
            let textarea = document.getElementById(textareaId);
            if (!textarea) {
                console.error('Textarea with ID ' + textareaId + ' not found.');
                return [];
            }

            // 获取textarea的值  
            let value = textarea.value;

            // 使用正则表达式分割值，匹配“；”、“，”和换行符  
            // 注意：\s+ 匹配一个或多个空白字符，包括空格、制表符、换行符等  
            // 但如果你只想匹配换行符，可以使用 \r\n|\n  
            let result = value.split(/；|;|，|,|\r?\n/g).filter(item => {
                return item && /^(\w+:\/\/)?\w+(\.\w+)+.*$/.test(item)
            });

            // 返回分割后的数组  
            return result;
        }

        function getFileName(path = '', isSuffix = false) {
            if (/^http.*/.test(path)) {
                path = path.split('?')[0];
                path = path.split('#')[0];
            }
            let pos1 = path.lastIndexOf('/');
            let pos2 = path.lastIndexOf('\\');
            let pos = Math.max(pos1, pos2);
            let fileName = pos < 0 ? path : path.substring(pos + 1);
            if (isSuffix) {
                return fileName;
            } else {
                let index = fileName.lastIndexOf('.');
                return fileName.substring(0, index < 1 ? 1 : index);
            }
        };

        function downloadAndCompressFiles(fileList, outputName, callback, progressCb) {
            console.log('fileList', fileList);
            // 创建一个新的JSZip实例
            let zip = new JSZip();
            let fileNames = [];

            // 用于追踪已下载的文件数量和下载失败的文件数量
            let downloadedFiles = 0;
            let failedFiles = 0;

            // 遍历文件列表，下载并添加到压缩包中
            fileList.forEach(function (url, index) {
                // 发送HTTP请求获取文件数据
                let originalFileName = getFileName(url, true);
                fetch(url)
                    .then(function (response) {
                        if (!response.ok) {
                            throw new Error('Download failed');
                        }
                        return response.blob();
                    })
                    .then(function (blob) {
                        // 获取文件扩展名
                        let fileType = blob.type;
                        let fileExtension = '.' + fileType.split('/')[1];

                        // 生成文件名（包括原始文件名和扩展名）
                        let fileName = originalFileName + (originalFileName.includes('.') ? '' : fileExtension);

                        // 重名文件，添加序号
                        if (fileNames.includes(fileName)) {
                            let count = 1;
                            let baseName = fileName.replace(/\.[^/.]+$/, ''); // Remove extension from filename
                            let extension = fileName.split('.').pop(); // Get the extension of the file

                            while (fileNames.includes(fileName)) {
                                fileName = baseName + '(' + count + ').' + extension;
                                count++;
                            }
                        }

                        // 将文件数据添加到压缩包中
                        zip.file(fileName, blob);
                        fileNames.push(fileName);

                        // 更新已下载的文件数量
                        downloadedFiles++;

                        progressCb({
                            total: fileList.length,
                            failedCount: failedFiles,
                            successCount: downloadedFiles,
                        })

                        // 检查是否所有文件都已下载完成
                        if (downloadedFiles === fileList.length) {
                            // 检查是否有文件下载失败
                            if (failedFiles === 0) {
                                // 生成压缩包
                                zip.generateAsync({ type: 'blob' }).then(function (content) {
                                    // 确定保存的文件名
                                    let saveFileName;
                                    if (outputName) {
                                        saveFileName = outputName.endsWith('.zip') ? outputName : outputName + '.zip';
                                    } else {
                                        saveFileName = 'download.zip';
                                    }

                                    // 使用file-saver库保存压缩包
                                    saveAs(content, saveFileName);

                                    // 调用回调函数，传递下载成功的文件数量
                                    if (callback) {
                                        callback(downloadedFiles);
                                    }
                                });
                            } else {
                                // 调用回调函数，传递下载成功的文件数量和下载失败的文件数量
                                if (callback) {
                                    callback(downloadedFiles, failedFiles);
                                }
                            }
                        }
                    })
                    .catch(function () {
                        // 更新下载失败的文件数量
                        failedFiles++;

                        progressCb({
                            total: fileList.length,
                            failedCount: failedFiles,
                            successCount: downloadedFiles,
                        })

                        // 检查是否所有文件都已下载完成
                        if (downloadedFiles + failedFiles === fileList.length) {
                            // 调用回调函数，传递下载成功的文件数量和下载失败的文件数量
                            if (callback) {
                                callback(downloadedFiles, failedFiles);
                            }
                        }
                    });
            });
        }
    </script>
</body>

</html>